<?php

/***********************************************/
/*TITULO */
/***********************************************/
echo" <div class=\"pag_content\">
 	<div class=\"pag_content_title\">
		<div class=\"pag_title_cap\">Cap&iacute;tulo 8: </div>
		<div class=\"pag_title_cont\">	Consistencia y concurrencia</div>
    </div>
    <div class=\"pag_content_body\">         
	<div class=\"contenido_principal\">	
		<br />";
/***********************************************/
/*TITULO PARRAFO */
/***********************************************/
echo "
	<div class=\"parrafo_titulo\">
	 Informacion de UNDO
	</div>";

/***********************************************/
/*CONTENIDO*/
/***********************************************/
echo "
<div class=\"parrafo\" align=\"justify\">
Los bloqueos de tablas son los sistemas que tiene Oracle para evitar que varios usuarios modifiquen los mismos datos al mismo tiempo. El primer usuario que ejecuta la sentencia DML bloqueara los datos que va a modificar, permitiendo al otro usuario tomar el control una vez haya ejecutado commit o rollback de la sentencia ejecutada.
</div>
<div class=\"parrafo\" align=\"justify\">
Estos bloqueos se realizan en una inmensa mayoria de las ocasiones implicitamente por Oracle, aunque puede haber varias situaciones en las que el usuario quiera bloquear toda la tabla de una forma explicita. Para ellos utilizaremos el comando LOCK TABLE especificando el nivel de bloqueo deseado.
</div>
<div class=\"parrafo\" align=\"justify\">
Los diferentes modos de bloqueo que nos vamos a encontrar son:
</div>
<div class=\"parrafo_lista_sub\">
- ROW SHARE: Permite accesos simultaneos a la tabla. Pero impide a otros usuarios bloquear la tabla en EXCLUSIVE MODE.
<br />
- ROW EXCLUSIVE: Este bloqueo se consigue de forma implicita en las sentencias DML (UPDATE, INSERT, DELETE). Identico al anterio pero tambien evitando que otros usuarios bloquen la tabla en SHARE MODE.
<br />
- SHARE: Permite realizar queries sobre la tabla, pero no permite que se realicen UPDATES sobre los datos. Este modo se consigue de forma automatica al ejecutar CREATE INDEX.
<br />
- SHARE ROW EXCLUSIVE:Utilizado este bloqueo para consultar a todoa la tabla, permite hacer queries a otros usuarios, pero impide que se bloque en modo SHARE y que se hagan updates  sobre los datos.
<br />
- EXCLUSIVE: Modo mas restrictivo, permite hacer queries sobre la tabla pero no permite ejecutar ninguna sentencia DML. Este bloqueo se obtiene automaticamente cuando hacemos un DROP TABLE.
</div>
<div class=\"parrafo\" align=\"justify\">
Tambien podemos generar con una query un bloqueo a nivel de fila. con SELECT ... FOR UPDATE.
</div>
<blockquote style=\"COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif\">
<pre><p>sql&gt; SELECT ID_USUARIO FROM USUARIOS FOR UPDATE;

</p></pre></blockquote>
<div class=\"parrafo\" align=\"justify\">
Esta query no solo esta seleccionando los ID de usuario sino que esta evitando mediante un bloqueo que otro usuario modifique los datos seleccionados hasta que no se realice un ROLLBACK o un COMMIT.
</div>
<div class=\"parrafo\" align=\"justify\">
Como hemos comentado anteriormente, cuando un usuario bloquea una tabla, otro usuario esperara hasta que el primero ejecute un commit o un rollback. Sino queremos esperar podemos ejecutar la sentencia con NOWAIT.
</div>
<div class=\"parrafo\" align=\"justify\">
Existen varias tablas dinamicas que nos pueden ayudar a saber que objetos estan bloqueados y que transacciones estan bloqueando esos objetos. Estas tablas son: V$SESSION, V\$TRANSACTION, V$LOCK, V$LOCKED_OBJECT.
</div>
<h3>KILL SESSION</h3>
<div class=\"parrafo\" align=\"justify\">
Puede ser que un proceso no haya terminado correctamente, dejando una tabla en un estado bloqueado. Para solucionar esto, sera el administrador el que tenga que matar la sesion que ha iniciado ese proces.
<br>
a) Vemos que OBJECT_ID tiene la tabla que esta bloqueada.
</div>
<blockquote style=\"COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif\">
<pre><p>sql&gt; SELECT OBJECT_ID FROM ALL_OBJECTS WHERE OBJECT_NAME LIKE '%USER_PRUEBA%'   -- OBJECT_ID=53977

</p></pre></blockquote>
<div class=\"parrafo\" align=\"justify\">
b) Comprobamos si realmente ese OBJECT_ID se encuentra bloqueado y en caso afirmativo que sesion lo esta bloqueando y el usuario que ha bloqueado esa sesion.
</div>
<blockquote style=\"COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif\">
<pre><p>sql&gt; SELECT L.SESSION_ID, L.ORACLE_USERNAME FROM V\$LOCKED_OBJECT L WHERE OBJECT_ID=53977;

</p></pre></blockquote>
<div class=\"parrafo\" align=\"justify\">
c) Obtenemos el ultimo parametro que nos falta para matar la sesion
</div>
<blockquote style=\"COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif\">
<pre><p>sql&gt; SELECT s.sid,s.serial#,s.USERNAME FROM   v\$session s;

	Salida:		-146	 146	 MOGU

</p></pre></blockquote>
<div class=\"parrafo\" align=\"justify\">
d) Matamos la sesion
</div>
<blockquote style=\"COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif\">
<pre><p>sql&gt;ALTER SYSTEM KILL SESSION '146,146' IMMEDIATE;

</p></pre></blockquote>
<div class=\"parrafo\" align=\"justify\">
o bien por comandos
</div>
<blockquote style=\"COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif\">
<pre><p>&gt;orakill ORCL 146 (orakill ORACLE_SID serial) 

</p></pre></blockquote>
<div class=\"parrafo\" align=\"justify\">
f) Comprobamos que la tabla ya no esta bloqueada
</div>
<blockquote style=\"COLOR: #2e5348; FONT-SIZE: 12px; FONT-WEIGHT: bold FONT:Arial, Helvetica, sans-serif\">
<pre><p>sql&gt; SELECT L.SESSION_ID, L.ORACLE_USERNAME 	FROM V\$LOCKED_OBJECT L WHERE OBJECT_ID=53977;

</p></pre></blockquote>
<br />

";

/***********************************************/
/*PIE*/
/***********************************************/
echo"
	</div> 		 
    </div>
    <div class=\"pag_content_footer\">
    </div>
    <div class=\"pag_content_nav\">		
		<div class=\"pag_contenido_left\">
			<a  class=\"cap_next\" href=\"oca_main.php?cap=9&part=1\">	&lt; Anterior </a>
		 </div>
		<div class=\"pag_contenido_right\" align=\"right\">	
			<a  class=\"cap_next\" href=\"oca_main.php?cap=9&part=0\">	Cap&iacute;tulo 9 &gt;</a>
		 </div>
	</div>      
</div>
";

?>